package com.shujia.mllib

import org.apache.spark.mllib.linalg.distributed.RowMatrix
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.linalg.{Matrices, Matrix, Vector, Vectors}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.rdd.RDD

object Demo2 {
  def main(args: Array[String]): Unit = {

    //稠密向量
    val den = Vectors.dense(Array(1.0, 2.0, 3.0, 0.0, 4.0))
    println(den)

  //稀疏向量
    val spa = Vectors.sparse(5, Array(0, 1, 2, 4), Array(1.0, 2.0, 3.0, 4.0))
    println(spa)

    /**
      * 我爱数加学院
      * 因为看见，所以相信
      * 梦想从这里开始
      */

    /**
      * 1、分词    ik分词器
      * 我 爱 数加 学院
      * 因为 看见 所以 相信
      * 梦想 从 这里 开始
      *
      * 2、构建词典
      *
      * 我 爱 数加 学院 因为 看见 所以 相信 梦想 从 这里 开始
      * 0  1   2     3   4    5    6    7    8    9   10   11
      *
      * 稠密向量
      *
      * 我爱数加学院  ---> (1,1,1,1,0,0,0,0,0,0,0,0)
      * 因为看见，所以相信   ---> (0,0,0,0,1,1,1,1,0,0,0,0)
      * 梦想从这里开始 -->  (0,0,0,0,0,0,0,0,1,1,1,1)
      *
      *
      * //如果词典很长，使用稠密向量比较占用空间
      *
      * 稀疏向量
      * 我爱数加学院 -->(12,(0,1,2,3),(1,1,1,1))
      * 因为看见，所以相信   --->(12,(4,5,6,7),(1,1,1,1))
      * 梦想从这里开始 --> (12,(8,9,10,11),(1,1,1,1))
      */


    //相当于一条训练集
    val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))

    // Create a labeled point with a negative label and a sparse feature vector.
    val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))

    val conf = new SparkConf().setMaster("local").setAppName("mllib")
    val sc = new SparkContext(conf)

    //读取svm数据返回一个RDD
    val data: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "data/人体指标.txt")
     data.foreach(println)

    /**
      * 矩阵
      *
      */

    // Create a dense matrix ((1.0, 2.0), (3.0, 4.0), (5.0, 6.0))
    val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
    println(dm)

    // Create a sparse matrix ((9.0, 0.0), (0.0, 8.0), (0.0, 6.0))
    val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 2, 1), Array(9, 6, 8))

    println(sm)



    val vectors = List(
      Vectors.dense(Array(1.0, 2.0, 3.0, 0.0, 4.0)),
      Vectors.dense(Array(1.0, 2.0, 3.0, 0.0, 4.0)),
      Vectors.dense(Array(1.0, 2.0, 3.0, 0.0, 4.0)),
      Vectors.dense(Array(1.0, 2.0, 3.0, 0.0, 4.0))
    )

    val vecRDD: RDD[Vector] = sc.parallelize(vectors)


    //构建分布式矩阵
    val rowMatrix = new RowMatrix(vecRDD)

    println(rowMatrix.numCols()) //列数量
    println(rowMatrix.numRows()) //行数量




  }
}
